//
// Created by daiyi on 2019/09/30.
//

#ifndef LEVELDB_STATS_H
#define LEVELDB_STATS_H

#include <string>
#include <cstdint>
#include <map>
#include <vector>
#include <cstring>
#include "timer.h"

using std::string;
using std::to_string;

int get_read_nums(std::vector<char> ops);
std::string get_dataname_from_filepath(std::string input_filename, std::string delimiter="/");
int readFileList(char *basePath, std::string data_name, int mod, std::string executable_file, int iteration, int key_size);
void perf_exclude_1st_Iteration(std::vector<std::vector<size_t>> times);

// Stats是单例类，有以下四个特征
namespace adgMod {

    class Timer;
    class Stats {
    private:
        // 1. 他有一个指向该类唯一实例的静态指针，并且是私有的
        static Stats* singleton;
        // 3. 它的构造函数是私有的，这样就不能从别处创建该类的实例
        Stats();

        std::vector<Timer> timers;  // 记录一串时间，分别对应不同的操作阶段吧。
    public:
        uint64_t initial_time;

        // 2. 他有一个公有的函数，可以获取这个唯一的实例，并且在需要的时候创建该实例
        static Stats* GetInstance();
        void StartTimer(uint32_t id);
        std::pair<uint64_t, uint64_t> PauseTimer(uint32_t id, bool record = false);
        void ResetTimer(uint32_t id);
        uint64_t ReportTime(uint32_t id);
        void ReportTime();

        uint64_t GetTime();
        void ResetAll();
        // 4. 程序运行结束时，系统会调用析构函数，该析构函数会删除单例的唯一实例
        ~Stats();
    };


}


#endif //LEVELDB_STATS_H
